package com.tally.project.system.book.service.impl;

import java.util.List;

import com.tally.common.enums.BookEnums;
import com.tally.common.enums.EverydayCategoryEnums;
import com.tally.common.thread.IdWorker;
import com.tally.framework.security.utils.SecurityUtils;
import com.tally.project.system.category.service.ICategoryService;
import com.tally.project.system.user.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.tally.project.system.book.mapper.BookMapper;
import com.tally.project.system.book.domain.Book;
import com.tally.project.system.book.service.IBookService;
import com.tally.common.utils.text.Convert;

/**
 * 账本Service业务层处理
 * 
 * @author soul
 * @date 2023-08-02
 */
@Service
public class BookServiceImpl implements IBookService 
{
    @Autowired
    private IdWorker worker;

    @Autowired
    private BookMapper bookMapper;

    @Autowired
    private ICategoryService categoryService;

    /**
     * 查询账本
     * @param id 账本主键
     * @return 账本
     */
    @Override
    public Book selectBookById(Long id)
    {
        return bookMapper.selectBookById(id);
    }

    /**
     * 查询账本列表
     * @param book 账本
     * @return 账本
     */
    @Override
    public List<Book> selectBookList(Book book)
    {

        return bookMapper.selectBookList(book);
    }

    /**
     * 新增账本
     * @param book 账本
     * @return 结果
     */
    @Override
    public int insertBook(Book book)
    {
        // 判断是否有该分类
        if (BookEnums.getBook(book.getSerial()) == null){
            return 0;
        }
        // 账本类型默认为使用
        int state = 1;

        if (book.getState() <= 0){
            state = 0;
        }
        // 获取用户信息
        User user = SecurityUtils.getUser();
        // 设置用户ID
        book.setId(worker.nextId());
        // 设置用户ID
        book.setUserId(user.getUserId());
        // 设置该账本状态
        book.setState(state);
        // 持久化到数据库
        int i = bookMapper.insertBook(book);
        // 新增成功则写入账单分类
        if (i > 0){
            addCategory(book.getSerial(), book.getId());
            // 当账本类型为默认使用状态时修改其他账本状态为其他状态
            if (book.getState() >= 1){
                bookMapper.updateBookState(book.getId(), user.getUserId());
            }
        }
        return i;
    }

    /**
     * 修改账本
     * @param book 账本
     * @return 结果
     */
    @Override
    public int updateBook(Book book)
    {
        // 获取用户信息
        User user = SecurityUtils.getUser();
        // 设置用户ID
        book.setUserId(user.getUserId());
        int i = bookMapper.updateBook(book);
        // 当账本类型为默认使用状态时修改其他账本状态为其他状态
        if (i > 0 && book.getState() >= 1){
            bookMapper.updateBookState(book.getId(), user.getUserId());
        }
        return i;
    }

    /**
     * 批量删除账本
     * @param ids 需要删除的账本主键
     * @return 结果
     */
    @Override
    public int deleteBookByIds(String ids)
    {
        return bookMapper.deleteBookByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除账本信息
     * @param id 账本主键
     * @return 结果
     */
    @Override
    public int deleteBookById(Long id)
    {
        return bookMapper.deleteBookById(id);
    }

    /**
     * 增加账单分类
     * @param serial   账本编号
     * @param id       账本ID
     */
    public void addCategory(int serial, long id){
        // 获取当前操作用户
        User user = SecurityUtils.getUser();
        // 日常分类
        if (serial == BookEnums.BOOK_1.getSerial()){
            categoryService.insertCategoryList(EverydayCategoryEnums.toList(user.getUserId(), id));
        }

    }
}
